package com.yfqy.app.util;

import com.yfqy.app.constant.GeneralConstants;
import com.yfqy.app.security.login.LoginUserInfo;

import java.util.function.Supplier;

public class AuthUserContext {

    private static final ThreadLocal<LoginUserInfo> USER_INFO_THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 设置用户信息
     */
    public static void setLocalAuthUser(LoginUserInfo loginUserInfo) {
        USER_INFO_THREAD_LOCAL.set(loginUserInfo);
    }

    /**
     * 获取用户信息
     */
    public static LoginUserInfo getLocalAuthUser() {
        return USER_INFO_THREAD_LOCAL.get();
    }

    /**
     * 获取用户ID（安全方法）
     */
    public static Long getUserId() {
        LoginUserInfo userInfo = getLocalAuthUser();
        return userInfo != null ? userInfo.getId() : GeneralConstants.DEFAULT_USER_ID;
    }

    /**
     * 获取用户名（安全方法）
     */
    public static String getUsername() {
        LoginUserInfo userInfo = getLocalAuthUser();
        return userInfo != null ? userInfo.getNickname() : null;
    }

    /**
     * 检查用户是否已认证
     */
    public static boolean isAuthenticated() {
        return getLocalAuthUser() != null;
    }

    /**
     * 清理ThreadLocal
     */
    public static void clearLocalAuthUser() {
        USER_INFO_THREAD_LOCAL.remove();
    }

    /**
     * 安全执行带有用户上下文的方法
     */
    public static <T> T executeWithContext(LoginUserInfo userInfo, Supplier<T> supplier) {
        setLocalAuthUser(userInfo);
        try {
            return supplier.get();
        } finally {
            clearLocalAuthUser();
        }
    }
}
